#!/bin/sh

gcc -g -no-pie elf_info.c -o code.elf

echo "**********************************************************"
file       code.elf  # 查看文件类型
readelf -h code.elf  # 查看ELF头
readelf -l code.elf  # 查看程序头表（加载信息）
readelf -S code.elf  # 查看节头表（段信息）
objdump -d code.elf  # 反汇编代码段

echo "**********************************************************"
echo "EFF Header:前64个字节"
hexdump -C code.elf -n 64

# 关键字段解析：
# • Magic：7F 45 4C 46（0x7F+ELF）。
# • Class：02表示64位文件。
# • Type：01 00（0x0001）表示可执行文件（ET_EXEC）。
# • Machine：3e 00（0x003e）表示x86-64架构。
# • Entry point：a0 04 40 00（0x4004a0），程序入口地址。
# • Start of program headers：40 00（0x40），程序头表起始位置。

echo "**********************************************************"
echo "ELF Program Header Table:"
readelf -l code.elf

# • LOAD段：• 第一个LOAD段为代码段（.text），权限R E（可读可执行）。
# • 第二个LOAD段为数据段（.data、.bss），权限RW（可读可写）。
echo "**********************************************************"
echo "ELF read .text info"
objdump -d code.elf

echo "**********************************************************"
echo "ELF read .data .bss .rodata info"
readelf -x .data code.elf
# • 0x2a（十进制42）对应global_init = 42。
# • 0x20064000是字符串"Hello ELF!"的地址（在.rodata段）。
readelf -x .rodata code.elf
readelf -x .bss code.elf
echo "**********************************************************"
readelf -s  code.elf
echo "**********************************************************"
readelf -S code.elf | grep debug #查看调试段
echo "**********************************************************"

# 第五步：ELF文件结构总结
# 结构作用ELF头标识文件类型、架构、入口点、程序头表位置。
# 程序头表指导操作系统加载段到内存。
# .text段存储可执行指令（如main函数）。
# .data段存储已初始化的全局变量和静态变量。
# .bss段存储未初始化的全局变量（程序加载时初始化为0）。
# .rodata段存储只读数据（如字符串常量）。
# .symtab段符号表，记录函数和变量的地址。
# .debug_*段调试信息，关联源代码和二进制指令。
# **********************************************************
# 修改elf内的信息
# printf "Hello HACK!" | dd of=code.elf bs=1 seek=$((0x4005e4)) conv=notrunc
# 查看修改后的内容
# xxd -s 0x4005e4 -l 12 target.elf  # 查看偏移 0x4005e4 处的 12 个字节
# **********************************************************
# 将elf 文件转成16进制的txt文件，再将txt转回成elf文件
# xxd code.elf > hexdump.txt       # 导出为十六进制文本
# vim hexdump.txt                  # 手动修改（注意保持格式）
# xxd -r hexdump.txt > target.elf  # 转换回二进制
# **********************************************************
# 使用hex编辑工具
# sudo apt install hexedit       # Debian/Ubuntu
# hexedit target.elf             # 直接编辑二进制
# **********************************************************
# 修改程序的入口地址
# sudo apt install patchelf
# patchelf --set-entry 0x401000 target.elf